#ifndef MODEL_MAN_HPP_INCLUDED
#define MODEL_MAN_HPP_INCLUDED

#include <set>
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp"
#include "rapidxml/rapidxml_print.hpp"
#include "basic.hpp"

#define EN_Sumulate            1



namespace shooter
{
namespace model_man
{
  enum Hand_Finger_e
  {
    FINGER_1 = 0,
    FINGER_2,
    FINGER_3,
    FINGER_4,
    FINGER_5,
    FINGER_NUM,
  };

  enum Fineger_Node_e
  {
    FINGER_NODE_1 = 0,
    FINGER_NODE_2,
    FINGER_NODE_3,
    FINGER_NODE_NUM,
  };

  template <int dummy>
  struct model_man_parms
  {
#if EN_Sumulate > 0u
    static const double g_Hand_FingerPartLen[FINGER_NUM][FINGER_NODE_NUM];
#endif
  };

#if EN_Sumulate > 0u
  template <int dummy>
  const double model_man_parms<dummy>::g_Hand_FingerPartLen[FINGER_NUM][FINGER_NODE_NUM-1] =
  {
    30, 30, 50,
    25, 20, 30,
    25, 25, 25,
    25, 20, 25,
    25, 15, 20,
  };
#endif

  template <class T>
  class finger_t
  {
  public:
    /* Constrcuture */
    finger_t()
    ~finger_t(){}


  private:
    /** @note No copy and assignment! */
    finger_t(){}
    finger_t(const finger_t & copy){}
    const finger_t operator=(const finger_t & copy){}

    basic::point_t<T> node_root_; // root node of finger.
    basic::point_t<T> node_array_[FINGER_NODE_NUM]; // from root to top.
  };

  template <class T>
  class hand_t
  {
  public:

  private:
    basic::point<T> node_root_; // root node of hand.
    finger_t finger_array_[FINGER_NUM];
  };
} // namespace model_man
} // namespace shooter



#endif
